//
//  StatusListViewModel.swift
//  WeiBo
//
//  Created by 小小罗 on 15/11/12.
//  Copyright © 2015年 RealMadrid. All rights reserved.
//

import Foundation
import SDWebImage


//微博数据列表模型  封装网络方法
class StatusListViewModel {



    //微博数据数组 
    lazy var statusList = [StatusViewModel]()
    
    
    //加载网络数据
    func loadData(isPullup isPullup: Bool, finished:(isSuccess:Bool)->()) {
        
        // 下拉刷新 id
        let since_id = isPullup ? 0 : (statusList.first?.status.id ?? 0)
        // 上拉刷新 id
        let max_id = isPullup ? (statusList.last?.status.id ?? 0) : 0

        
        NetWorkTools.sharedTools.loadStatus(since_id:since_id, max_id: max_id){ (result, error) -> () in
            
            if error != nil {
                print("出错了")
                
                finished(isSuccess: false)
                return
            }
            
            //判断result的结构是否正确
            guard let array = result?["statuses"] as?[[String :AnyObject]] else{
                
                print("数据格式错误")
                
                finished(isSuccess: false)
                return

            }
            
            // 遍历字典的数组，字典转模型
            // 1. 可变的数组
            var dataList = [StatusViewModel]()
            
            // 2. 遍历数组
            for dict in array {
                dataList.append(StatusViewModel(status: Status(dict: dict)))
            }
            
            print("刷新了\(dataList.count)条微博")
            
            // 3. 拼接数据
            if max_id > 0 {             // 上拉刷新，将新数据拼接在当前数组的末尾
                self.statusList += dataList
            } else {                    // 下拉或默认刷新，将新数据追加在当前数组的前面
                self.statusList = dataList + self.statusList
            }

            
            // 完成回调
            //finished(isSuccess: true)
            
            //4.缓存单张图片 完成回调
            self.cacheSingleImage(dataList, finished: finished)
        }
    }
    
    
    
    //缓存单张图片
    private func cacheSingleImage(dataList: [StatusViewModel],finished: (isSuccess: Bool)->()) {
    
        //1.创建调度组
        let group = dispatch_group_create()
        //缓存数据长度
        var dataLength = 0
        //2.遍历视图模型数组
        for vm in dataList {
        
        
            if vm.thumbnailUrls?.count != 1 {
                continue
            }
            
            //获取url
            let url = vm.thumbnailUrls![0]
            
            print("开始缓存图像\(url)")
        
            // SDWebImage - 下载图像(缓存是自动完成的)
            // 入组 - 监听后续的 block
            dispatch_group_enter(group)
            
            //SDWebImage 的核心下载函数，如果本地缓存已经存在，同样会通过完成回调返回
            SDWebImageManager.sharedManager().downloadImageWithURL(
                url,
                options: [SDWebImageOptions.RefreshCached, SDWebImageOptions.RetryFailed],
                progress: nil,
                completed: { (image, _, _, _, _) -> Void in
                    
                    //单张图片下载完成 计算长度
                    if let img = image,let data = UIImagePNGRepresentation(img) {
                        //累加二进制数据长度
                        dataLength += data.length
                    
                    }
                    
                    
                    
                        //出组
                    dispatch_group_leave(group)
        
        })
            
        
    }
        
        //监听调度组完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            
            print("缓存完成！\(dataLength / 1024) K")
            
            // 完成回调 - 控制器才开始刷新表格
            finished(isSuccess: true)

        }
    
        
    
    
    
    }
    
    
}